home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 32 / Amiga Format AFCD32 (Nov 1998, Issue 117).iso / -seriously_amiga- / programming / c / mesa-2.6 / readme.amiga < prev   
Text File  |  1998-08-10  |  12KB  |  338 lines

  1.  
  2.                              AmigaMesaRTL 1.0
  3.                       A run-time library of Mesa 2.6
  4.  
  5.                          by Jarno van der Linden
  6.                             jarno@kcbbs.gen.nz
  7.  
  8.              Mesa 2.6 is Copyright (C) 1995-1998  Brian Paul
  9.  
  10.  
  11. INTRODUCTION
  12. ============
  13.  
  14. Once upon a time there was an Amiga port of Mesa by Stefan Zivkovic.
  15. However, just as this port became interesting, Stefan could no longer
  16. support it.
  17.  
  18. Then came CyberGL. A run-time library, which ran reasonably comfortably
  19. even on lower-end machines with AGA. Unfortunately, it only implemented a
  20. subset of OpenGL. Furthermore, the output even on a 256 colour AGA screen
  21. was far from impressive. At present, development seems to have stalled
  22. (possibly pending the release of the CV-PPC and BVision cards).
  23.  
  24. Back to Mesa, through H&P we've seen the release of StormMesa.
  25. Unfortunately this too comes in the form of a link library.
  26.  
  27. So I set out to create my own driver with the following objectives:
  28.  
  29.     - Based on the latest release of Mesa
  30.     - Should come in the form of a run-time library
  31.     - Reasonable speed on an 50MHz '030/'881 system
  32.     - Good quality output on AGA
  33.  
  34. With AmigaMesaRTL, I think I have achieved these goals. Of course, don't
  35. expect miracles. Framerates are still better counted in seconds-per-frame
  36. rather than frames-per-second on my machine (A1200, Blizzard1230IV, 50MHz
  37. '030/'881, 32MB fast). But it is still faster than CyberGL and the output
  38. is a significantly better.
  39.  
  40.  
  41.  
  42. THEORY OF OPERATION
  43. ===================
  44.  
  45. The driver (amigamesertl.c) does all reading from and writing to a simple
  46. memory buffer. This buffer is made up out of single bytes in the case of
  47. colour index mode, and 4 bytes in the case RGB or RGBA mode.
  48.  
  49. When glFlush() is called, the buffer is written to the window using a
  50. quantization library. In index mode, the default quantizer calls
  51. WritePixelArray8(). In RGB mode, the buffer is first passed to a colour
  52. quantization algorithm. The resulting palette is loaded with LoadRGB32(),
  53. and the quantized buffer is written to the window with WritePixelArray8().
  54.  
  55. The quantizer is a slightly modified version of DL1 from a package by
  56. Dennis Lee (denlee@ecf.utoronto.ca). I've included the original
  57. documentation in the amiga/quantizers/dl1 directory.
  58.  
  59. Because of the various buffers involved, AmigaMesaRTL does use a fair bit
  60. of memory. But the output is about as good as it can get in 256 colours,
  61. and as all the drawing is done off-screen most of the AGA speed bottleneck
  62. is avoided.
  63.  
  64.  
  65.  
  66. COMPILING THE LIBRARY
  67. =====================
  68.  
  69. The AmigaMesaRTL distribution only contains the changed and new files of
  70. Mesa. You will need the Mesa 2.6 distribution. Once you have obtained the
  71. Mesa 2.6 distribution and unpacked it to somewhere, copy the amiga
  72. directory of AmigaMesaRTL to the Mesa directory. Go to the amiga/src
  73. directory, change the SCOPTIONS file to suit your system (mainly the MATH
  74. and CPU settings), and run SMake. Sit back, relax, enjoy life. This is
  75. going to take a while.
  76.  
  77. Note that there are still a few references to __XCEXIT(). Just ignore it
  78. and let the linker replace it with __stub().
  79.  
  80. Once this is done, you should end up with a file called mesa.library in
  81. the amiga/library directory.
  82.  
  83. Next, go to the amiga/lib directory, edit the SCOPTIONS file if you want
  84. to, run SMake. Out should come Mesa.LIB.
  85.  
  86. Finally, compile a quantizer library. For dl1, go to amiga/quantizers/dl1
  87. and run SMake. A library called "dl1" (note no ".library") should appear
  88. in amiga/library/quantizers.
  89.  
  90. That is all that is needed to get a working mesa library.
  91.  
  92.  
  93.  
  94. USING THE LIBRARY
  95. =================
  96.  
  97. To compile a program using AmigaMesaRTL, make sure the compiler can see
  98. the files in amiga/include and the link libraries in amiga/lib (by e.g.
  99. adding them to your INCLUDE: tree).
  100.  
  101. Mesa.LIB contains autoopen code for the mesa.library, so you shouldn't
  102. have to worry about opening and closing it. Just don't forget to link with
  103. Mesa.LIB.
  104.  
  105. Once you have set up your screen and window as per normal, call
  106. AmigaMesaRTLCreateContext() to create a new rendering context for the
  107. window. Make sure it is current by calling AmigaMesaRTLMakeCurrent().
  108.  
  109. Do lots of interesting graphics stuff. Don't forget that glFlush() has to
  110. be called (directly or indirectly) for the result to appear in the window.
  111.  
  112. Before closing the window, you should destroy the context with
  113. AmigaMesaRTLDestroyContext().
  114.  
  115. See the included examples for inspiration..
  116.  
  117. Tags
  118. ----
  119.  
  120. AmigaMesaRTLCreateContext() and AmigaMesaRTLCreateContextA() understand
  121. the following tags:
  122.  
  123.   Tag Name    : AMRTL_RGBAMode
  124.   Values      : TRUE | FALSE
  125.   Default     : TRUE
  126.   Description : Use RGBA colour if TRUE, index colours if FALSE
  127.  
  128.   Tag Name    : AMRTL_IndexMode
  129.   Values      : TRUE | FALSE
  130.   Default     : FALSE
  131.   Description : Use index colours if TRUE, RGBA colour if FALSE
  132.  
  133.   Tag Name    : AMRTL_NumColours
  134.   Values      : 2...256
  135.   Default     : 256
  136.   Descrption  : Number of colours to allocate
  137.  
  138.   Tag Name    : AMRTL_NumColors
  139.   Description : To keep our American friends happy
  140.  
  141.   Tag Name    : AMRTL_ColourBase
  142.   Values      : 0...254
  143.   Default     : 0
  144.   Description : Palette index of the first colour
  145.  
  146.   Tag Name    : AMRTL_ColorBase
  147.   Description : More Americana
  148.  
  149.   Tag Name    : AMRTL_Quantizer
  150.   Values      : A string
  151.   Default     : Content of environment variable AmigaMesaRTL/Quantizer
  152.               : or the value "dl1" if not set
  153.   Description : Name of quantizer to use
  154.  
  155.   Tag Name    : AMRTL_QuantizerVersion
  156.   Values      : Any ULONG
  157.   Default     : Content of env. variable AmigaMesaRTL/QuantizerVersion
  158.               : or 0 if not set
  159.   Description : Minimum library version of quantizer to use
  160.  
  161.  
  162. GLUT
  163. ====
  164.  
  165. Having a Mesa library is all fine and dandy, but most Mesa and OpenGL
  166. examples use the GL Utility Toolkit (GLUT) by Mark Kilgard. So the obvious
  167. answer is: we need a port of GLUT.
  168.  
  169. Having looked at the GLUT source code, this is easier said than done. It
  170. is highly X11-centric, with a Windows port mixed in. I thought about it,
  171. but in the end I decided to do a from-scratch GLUT look-alike
  172. implementation. It can be found in amiga/src-glut.
  173.  
  174. At present, most of the most-commonly used functions are implemented. No
  175. guarantee that they behave identically to the official GLUT distribution,
  176. but most of the redbook examples seem to work OK.
  177.  
  178. Compiling GLUT
  179. --------------
  180.  
  181. To compile the GLUT library, go to the amiga/src-glut directory, set up
  182. the SCOPTIONS file to your liking, run SMake, and hey-presto! out comes
  183. amiga/lib/GLUT.LIB.
  184.  
  185. Using GLUT
  186. ----------
  187.  
  188. when compiling a GLUT program, make sure you link with GLUT.LIB and
  189. Mesa.LIB.
  190.  
  191. When run, a glut program will by default try to open a window on a public
  192. screen named Mesa. Use one of the zillion pubscreen managers available on
  193. AmiNet to set one up.
  194.  
  195. GLUT Menus
  196. ..........
  197. The GLUT menus use the usual Amiga menu system. Instead of having a menu
  198. associated with a mouse button, there is a "Left Menu", "Middle Menu", and
  199. "Right Menu" menu.
  200. As the Amiga menu system only supports up to one level of sub-menus, any
  201. sub-sub-menus (and sub-sub-sub-menus and sub-sub-sub-sub-menus and ...)
  202. will be changed to a sub-menu after the parent.
  203.  
  204. GLUT mouse buttons
  205. ..................
  206. As the right mouse button is tied up with menus, middle and right mouse
  207. button presses can be done by qualifying the left mouse button press with
  208. the Right-Amiga and Right-Alt keys respectively. For those of you with
  209. three-button mice, the middle button should also be recognised.
  210.  
  211. GLUT termination
  212. ................
  213. The GLUT main loop is traditionally terminated by exit()'ing the program.
  214. Amiga GLUT uses SAS/C's STI_ and STD_ mechanism to clean up on exit().
  215. Quiting a GLUT program is usually done by pressing the ESC key. Clicking
  216. the window close button will cause Amiga GLUT to call the context's
  217. keyboard function with an ESC key code.
  218. However, some example programs never exit. Instead they expect the user to
  219. kill the program (by e.g. ^C). To handle such evil programs, Amiga GLUT
  220. has a panic drop-through. If pressing the window close button has no
  221. effect (i.e. the program is not listening to ESC key presses), a second
  222. click on the window close button will cause glutMainLoop() to return. This
  223. usually works as glutMainLoop() is often the last command in main() before
  224. it returns. But, as this is against the documented behaviour of
  225. glutMainLoop(), Bad Things may happen instead.
  226.  
  227. GLUT keys
  228. .........
  229. The GLUT special keys implemented are: the cursor keys, and functon keys
  230. F1 to F10.
  231.  
  232. Idle
  233. ....
  234. A single glutMainLoop() loop will handle all the messages on the queue. If
  235. set, glutIdleFunc() will be called whenever glutMainLoop() finds no
  236. messages to handle (other than IDCMP_INTUITICKS) in a single loop. (This
  237. is in contrast to a macintosh implementation I know of which actually
  238. speeds up if you e.g. press a key).
  239.  
  240. Running a GLUT program
  241. ----------------------
  242.  
  243. Any GLUT program which calls glutInit() (as all should), recognise the
  244. following command line options:
  245.  
  246.   Option      : -numcolours
  247.   Values      : 2...256
  248.   Default     : 248
  249.   Description : Set value for AMRTL_NumColours
  250.  
  251.   Option      : -numcolors
  252.   Description : Americana
  253.  
  254.   Option      : -colourbase
  255.   Values      : 0...254
  256.   Default     : 8
  257.   Description : Set value for AMRTL_ColourBase
  258.  
  259.   Option      : -colorbase
  260.   Description : Americana
  261.  
  262.   Option      : -pubscreen
  263.   Values      : <any name>
  264.   Default     : MESA
  265.   Description : Set the public screen to open windows on
  266.  
  267.   Option      : -quantizer
  268.   Values      : <any name>
  269.   Default     : <not set>
  270.   Description : Set value for AMRTL_Quantizer
  271.  
  272.   Option      : -quantizerversion
  273.   Values      : <any ULONG>
  274.   Default     : <not set>
  275.   Description : Set value for AMRTL_QuantizerVersion
  276.  
  277. So for example, to get some interesting things going on the same screen
  278. without the colours interfering:
  279.   run bounce -colourbase 8 -numcolors 4
  280.   run gears -colourbase 12 -numcolors 64
  281.   run isosurf -va -colourbase 76 -numcolors 88
  282.   run fog -colourbase 164 -numcolors 92
  283.  
  284. If a program doesn't appear to give any output, check to see if it calls
  285. glFlush(), or anything that calls it (like glutSwapBuffers()). If it
  286. doesn't, add it (typically at the end of the display() function). Also
  287. make sure you give the program plenty of stack.
  288.  
  289.  
  290. WARNING!
  291. --------
  292.  
  293. Please beware that at present, Amiga GLUT lacks a lot of error checking.
  294. Bad Things will very likely happen if Something Goes Wrong.
  295.  
  296.  
  297. Quantizer Plugins
  298. =================
  299.  
  300. Since version 1.1, AmigaMesaRTL has a plugin system for quantizers. They
  301. are actually just libraries. Which quantizer library to use is determined
  302. by the environment variables "AmigaMesaRTL/Quantizer" and
  303. "AmigaMesaRTL/QuantizerVersion". If they are not set, the defaults are
  304. "dl1" and "0" respectively. The AMRTL_Quantizer and AMRTL_QuantizerVersion
  305. tags, and matching glutInit() arguments, overide these.
  306.  
  307. The quantizers are expected to be found in the "libs:quantizers/"
  308. directory.
  309.  
  310.  
  311. Writing your own quantizer
  312. --------------------------
  313.  
  314. The quantizer API is documented in amiga/quantizers/quantizer.doc and the
  315. .fd file is amiga/libraries/quantizers/quantizer.fd. See the dl1 quantizer
  316. source for an example implementation. If there is something you would like
  317. to see added to the interface, tell me. Particularly I would like to know
  318. if ARGB is more convenient than RGBA.
  319.  
  320.  
  321. FUTURE
  322. ======
  323.  
  324. Mesa 3.0 will shortly emerge from beta state. It shouldn't take long for
  325. me update the library to it when it does.
  326.  
  327. Better colour management. At present, no locking is done, and multiple
  328. windows of the same GLUT instance will share the same palette indices.
  329.  
  330. Fix the zillions of bugs everyone but me will no doubt find.
  331.  
  332. Maybe an RTG option. I don't have access to a graphics board, and when P5
  333. comes out with their PPC graphics boards, this whole library might be
  334. obsolete.
  335.  
  336. Change GLUT to a run-time library.
  337.  
  338.